# 文件编码概念
"""
计算机中有许多可用编码:
    UTF-8   最常用的编码，通用编码
    GBK     最早中文体系中使用的
    Big5    繁体字经常使用
不同的编码，将内容翻译成二进制也是不同的
"""
import time

# 文件的读取操作
"""
# 打开文件
语法：open(name,mode,encoding)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读r、写入w、追加a等。
    r：以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    w：打开一个文件只用于写入。如果该文件已存在则打开文件，并从开头开始编辑，原有内容会被删除。如果该文件不存在，创建新文件。
    a：打开一个文件用于追加。如果该文件已存在，新的内容将会被写入到已有内容之后。如果该文件不存在，创建新文件进行写入。
encoding:编码格式(推荐使用UTF-8)
# 示例
f = open("D:/test.py", "r", encoding="UTF-8")    # 因为encoding这个参数位置不在第三位，所以不能用位置传参
print(type(f))    # <class '_io.TextIOWrapper'> 表示对文本文件进行IO操作功能的一个类（对象）


示例代码:
f = open('python.txt', 'r', encoding="UTF-8")
# encoding的顺序不是第三位，所以不能用位置参数，用关键字参数直接指定

注意事项
注意:此时的`f`是`open'函数的文件对象，对象是Python中一种特殊的数据类型，拥有属性和方法，可以使用对象.属性
或对象.方法对其进行访问，后续面向对象课程会给大家进行详细的介绍。



# 读操作相关方法
read()方法:
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节)，如果没有传入num，那么就表示读取文件中所有的数据。

readlines()方法:
readlines可以按照行的方式把整个文件中的内容进行一次性读取，并且返回的是一个列表，其中每一行的数据为一个元素。
# 示例
f = open("file.txt", "r", encoding="UTF-8")
print(type(f))    # <class '_io.TextIOWrapper'> 表示对文本文件进行IO操作功能的一个类（对象）
# 读取文件 - read()
# print(f"读取10个字节的结果位为：{f.read(10)}")   #  当别人吊你胃口时，这
# print(f.read())     # 打印剩下的，不读取已读取的数据
# print("------------------------------")

# 读取文件 - readlines()
lines = f.readlines()     # 读取文件的全部行，封装到列表中
print(f"lines对象的数据类型是:{type(lines)}")   # lines对象的数据类型是:<class 'list'>
print(f"lines对象的内容是：{lines}")           # lines对象的内容是：[]




# readline()方法 ：一次读取一行内容
f = open("file.txt", "r", encoding="UTF-8")
line1 = f.readline()
line2 = f.readline()
line3 = f.readline()
print(f"第一行数据是{line1}")
print(f"第二行数据是{line2}")
print(f"第三行数据是{line3}")

# f.close()   关闭文件
# 最后通过close，关闭文件对象，也就是关闭对文件的占用
# 如果不调用close,同时程序没有停止运行，那么这个文件将一直被Python程序占用。


# for循环读取文件行
for line in open("file.txt", "r", encoding="UTF-8"):
    print(line)
#每一个line临时变量，就记录了文件的一行数据
# 示例
f = open("file.txt", "r", encoding="UTF-8")
for line in f:
    print(line)
# time.sleep(500000)    # 程序在这里暂停执行500000秒
f.close()  # 关闭文件



# with open() as name 语法
with open("file.txt", "r", encoding="UTF-8") as f:
    for line in f:
        print(f"每一行的内容为：{line}")
# 通过在with open的语句块中对文件进行操作
# 可以在操作完成后自动关闭close文件，避免遗志掉close方法


# 读取文件作业
f = open("test85.txt", "r", encoding="UTF-8")
# 方法一
# read = f.read()
# count = read.count("itheima")
# print(count)   # 6

# 方法二
count = 0    # 使用变量来累计出现次数
for line in f:
    new_line = line.strip()   # 去除前后空格以及换行符
    words = new_line.split(" ")
    print(words)
    for x in words:
        if x == "itheima":
            count += 1

f.close()

"""


# 文件的写入
"""
# 文件写入,写内存
f.write("内容")

# 内容刷新，刷新到硬盘
f.flush()

注意：
    直接调用write，内容并未真正写入文件，而是会积攒在程序的内存中，称之为缓冲区
    当调用flush的时候，内容会真正写入文件
    这样做是避免频繁的操作硬盘，导致效率下降(一堆，一次性写磁盘)
    
# 打开不存在的文件
f = open("test88.txt", "w", encoding="UTF-8")  # 文件不存在，W模式会帮我们创建文件
f.write("hello word！！！")    # 内容写在内存中
# f.flush()                # 将内存中攒积的内容写到硬盘的文件中
f.close()                # close方法，内置flush功能的

# 打开存在的文件
f = open("test88.txt", "w", encoding="UTF-8")
f.write("itheima")
f.flush()    # test88.txt文件里就有itheima内容了

"""


# 文件的追加"a"
"""
# 文件写入,写内存
f.write("内容")

# 内容刷新，刷新到硬盘
f.flush()

注意：
    a模式，文件不存在会创建文件
    a模式，文件存在会在最后，追加写入文件

f.write("\n追加内容")   # 可以使用\n写入时换行符

"""


# 文件操作的综合案例
"""
需求：读取文件，将文件备份，同时将文件内标记为测试的数据丢失
"""

"""
f = open("test90.txt", "r", encoding="UTF-8")
add = open("addtest90.txt", "w", encoding="UTF-8")
for line in f:
    line = line.strip()
    if line.split(",")[4] == "测试":
        continue       # 进入下一次循环

    # 将内容写出去
    add.write(line)
    # 由于前面对内容进行了strip()的操作，使用要手动写出换行符
    add.write("\n")

f.close()
add.close()

"""




